import os

import requests
import json
import time

from loguru import logger
from faiss_rag.store import  EntertainmentRAGStore
from api.baidu_crawl import crawl_baidu_hotsearch

# 本地Ollama服务地址
OLLAMA_API_URL = "http://localhost:11434/api/generate"

def is_entertainment_or_emotional(text: str):
    prompt = f"""你是一个严格的文本分类器，仅判断文本是否属于“娱乐性”或“带感情色彩”，其他类别均为“否”。
【分类标准】
- 娱乐性：明星（如周杰伦、杨幂）、综艺节目（如《奔跑吧》）、影视剧（如《繁花》）、网红动态、恋爱绯闻、搞笑段子；
- 感情色彩：含“愤怒/开心/难过/震惊”等词、主观评价（如“这东西超差”）、煽情语言（如“看完哭了”）。
【正反示例】
- 是：周杰伦新歌上线，粉丝熬夜抢购；《奔跑吧》新嘉宾官宣；
- 否：2024年GDP数据公布；如何申请公积金贷款；
【输出要求】
仅输出“是”或“否”，不附加任何文字、标点、换行。

文本：{text}
答案："""

    # 构建请求参数（和ollama.generate的参数对应）
    payload = {
        "model": "deepseek-r1:7b",  # 用你拉取的量化模型
        "prompt": prompt,
        "options": {
            "temperature": 0.1,
            "num_ctx": 512,
            "num_thread": 4
        },
        "stream": False  # 关闭流式输出，直接获取完整结果
    }

    try:
        # 发送POST请求（用session保持连接复用，减少握手开销）
        with requests.Session() as session:
            response = session.post(
                OLLAMA_API_URL,
                data=json.dumps(payload),
                headers={"Content-Type": "application/json"},
                timeout=30  # 超时时间（秒），避免无限等待
            )
        response.raise_for_status()  # 检查HTTP错误（如500、404）
        result = response.json()
        answer = result.get("response", "").strip()
        # 清洗输出
        answer = answer[0].lower() if (answer and len(answer) >= 1) else "否"
        return answer == "是"
    except Exception as e:
        print(f"[错误] API调用失败: {e}")
        return False


existing_titles = set()
if os.path.exists("../../agent/entertainment_hotsearch.txt"):
    with open("../../agent/entertainment_hotsearch.txt", "r", encoding="utf-8") as f:
        for line in f:
            # 每行格式：[YYYY-MM-DD] 标题
            if "] " in line:
                title = line.split("] ", 1)[1].strip()
                existing_titles.add(title)



# 测试性能
# if __name__ == '__main__':
#     hot_list  =  crawl_baidu_hotsearch()
#     test_texts = []
#     increment = []
#
#     for item in hot_list:
#         test_texts.append(item['title'])
#
#     for text in test_texts:
#         result = is_entertainment_or_emotional(text)
#         if result:
#             increment.append(text)
#             # print(f"【{'娱乐/情感' }】{text}")
#             if text not in existing_titles:
#                 current_date = time.strftime("%Y-%m-%d", time.localtime())
#                 with open("entertainment_hotsearch.txt", "a", encoding="utf-8") as f:
#                     f.write(f"[{current_date}] {text}\n")
#                 existing_titles.add(text)
#
#     logger.info("抓取已结束")
#
#     # for text in increment:
#     store = EntertainmentRAGStore()
#     store.add_texts(increment)


if __name__ == '__main__':
    logger.info("程序启动，将每30分钟执行一次抓取任务")
    # 无限循环实现24小时运行
    while True:
        try:
            hot_list = crawl_baidu_hotsearch()
            test_texts = []
            increment = []

            for item in hot_list:
                test_texts.append(item['title'])

            for text in test_texts:
                # result = is_entertainment_or_emotional(text)
                if 1:
                    increment.append(text)
                    if text not in existing_titles:
                        current_date = time.strftime("%Y-%m-%d", time.localtime())
                        with open("../../../agent/entertainment_hotsearch.txt", "a", encoding="utf-8") as f:
                            f.write(f"[{current_date}] {text}\n")
                        existing_titles.add(text)

            logger.info("本次抓取已结束，增量数据已处理")

            # 将增量添加到RAG
            if increment:  # 只有有增量时才操作，优化性能
                store = EntertainmentRAGStore()
                store.add_texts(increment)
                logger.info(f"已向RAG存储 {len(increment)} 条增量数据")

        except Exception as e:
            logger.error(f"本次任务执行出错: {str(e)}，将继续执行下一次任务")

        # 休眠30分钟（30*60秒）
        logger.info("开始休眠30分钟...")
        time.sleep(1800)
